from PySide6.QtCore import QObject
from PySide6.QtGui import QTransform
from PySide6.scripts.metaobjectdump import Signal

from 程序核心代码.mvvm重构.基础定义.基础图形项.节点接口 import 连接线触发按键
from 程序核心代码.mvvm重构.基础定义.基础图形项.节点接口.连接点 import 连接点
from 程序核心代码.mvvm重构.基础定义.基础图形项.连接线.基础线条 import 基础连接线
from 程序核心代码.mvvm重构.基础定义.基础图形项.连接线.连接线图形项定义 import 连接线基础图形项



class 连接线图形项管理:
    def __init__(self, 节点图形项管理器):
        super().__init__()
        self.节点图形项管理器=节点图形项管理器
        self.临时线条 = None
        self.连接起点 = None
        self.连接线图形项集合=set()

    def 生成连接线图形项(self,连接线模型):
        # print("生成连接线图形项")
        # print(连接线模型.__class__.__name__)
        # print("起始接口：", 连接线模型.起始接口.__class__.__name__)
        # print("结束接口：", 连接线模型.结束接口.__class__.__name__)
        连接线图形项 = 连接线基础图形项(连接线模型,父项=self.节点图形项管理器.容器)
        self.连接线图形项集合.add(连接线图形项)
        return 连接线图形项

    def 加载连接线图形项(self):
        print("加载连接线图形项")
        for 连接线图形项 in self.连接线图形项集合:
            连接线图形项.setParentItem(self.节点图形项管理器.容器)
            self.节点图形项管理器.容器.添加图形项信号.emit(连接线图形项)
            连接线图形项.连接线图形项刷新()
    def 移除连接线图形项(self, 连接线图形项):
        self.连接线图形项集合.remove(连接线图形项)
        连接线图形项.setParentItem(None)
        连接线图形项.deleteLater()
        #self.移除图形项信号.emit(连接线图形项)
    def 开始连接线(self, 连接点):
        self.连接起点 = 连接点
        起点场景位置 = self.连接起点.scenePos()
        起点位置 = self.节点图形项管理器.容器.mapFromScene(起点场景位置)
        #起始接口.临时线条 = 基础连接线(QLineF(起点位置,起点位置))
        self.临时线条 = 基础连接线()
        #起始接口.临时线条.setPen(QPen(Qt.black, 2, Qt.DashLine))
        self.临时线条.setParentItem(self.节点图形项管理器.容器)

    def 连线途中(self, 事件):
        if self.临时线条:
            起点场景位置 = self.连接起点.scenePos()
            终点场景位置 = 事件.scenePos()
            起点位置 = self.节点图形项管理器.容器.mapFromScene(起点场景位置)
            终点位置 = self.节点图形项管理器.容器.mapFromScene(终点场景位置)
            self.临时线条.更新连接线(起点位置, 终点位置)
            #新线条 = QLineF(起点位置, 终点位置)
            #起始接口.临时线条.setLine(新线条)

    def 完成连线(self, 事件):
        print("完成连线")
        if 事件.button() == 连接线触发按键:
            if self.临时线条:
                # 起始接口.场景.removeItem(起始接口.临时线条)
                #起始接口.所属节点模型管理器.容器.removeItem()
                self.临时线条.setParentItem(None)
                self.临时线条=None
            item = self.节点图形项管理器.容器.scene().itemAt(事件.scenePos(), QTransform())
            if isinstance(item, 连接点):
                if self.连接起点:
                    self.完成连接线(item)
            # elif isinstance(item, 连接线图形项):
            #     print(item)
            #     if self.连接起点:
            #         self.完成连接线(item.结束接口.连接点)
            else:
                print("不是连接点")
                print(item.__class__.__name__)
                print(self.连接起点.接口模型.节点模型.__class__.__name__)

                #调用开始起点的未知连接对象处理
                #self.连接起点.接口模型.节点模型.连接未知对象(self.连接起点.接口模型, 事件)
            self.连接起点 = None
    def 完成连接线(self, 终点):
        if self.临时线条:
            self.临时线条.setParentItem(None)
            self.临时线条.deleteLater()

        if self.连接起点:
            连接起点 = self.连接起点
            连接终点 = 终点
            if self.连接起点.接口模型.方向 == "输入":
                连接起点 = 终点
                连接终点 = self.连接起点
            self.添加连接线(连接起点.接口模型, 连接终点.接口模型)
        self.连接起点 = None
    def 添加连接线(self, 起点, 终点):
        print("起点接口：" + 起点.__class__.__name__)
        print("结束接口：" + 终点.__class__.__name__)
        # if 起点.从接口手动连接(终点):
        #     起点.图形项.连接点.连接线刷新()
        #self.容器节点图形项管理器.节点模型管理器.
        终点.节点模型.连接节点事件(起点, 终点)



    # def 更新所有连接线位置(self):
    #     if self.连接线列表:
    #         for _连接线 in self.连接线列表:
    #             _连接线.连接线图形项刷新()
    #     # else:
    #     # print("没有连接线")
